package object;
/** Object */
public class ObjectDemo {
    public static void main(String[] args) {

        String s1 = new String("hello");
        String s2 = new String("hello");
        //String类重写了equals(), 来比较字符串内容是否相同
        System.out.println(s1.equals(s2));//true

        StringBuilder builder1 = new StringBuilder("hello");
        StringBuilder builder2 = new StringBuilder("hello");
        //StringBuilder类没有重写equals(),因此调用的还是Object类的equals()来比较地址
        System.out.println(builder1.equals(builder2));//false

        //s1与builder1类型不同, 所以equals()一定是false
        System.out.println(s1.equals(builder1));//false


        /*
        调用Object类的equals(), 底层逻辑还是在用 == 比较地址, 没有参考意义
        若是想比较对象的属性值是否相同, 我们认为Object类的equals()并不能满足需求,
        因此常常需要重写equals()来比较属性的值

        Point p1 = new Point(100,200);
        Point p2 = new Point(100,200);
        System.out.println(p1==p2);//false , == 是比较对象地址
        System.out.println(p1.equals(p2));//true, 因为引用的变量Point类中重写了equals()方法, 所以此处调用的是重写之后的equals()

        // 重写equals()
        public boolean equals(Object o) {
            if (this == o) return true;
            //this = p1 , o = p2, 这里的对比是两个地址对比
            if (o == null || getClass() != o.getClass()) return false;
            // o有值所以≠null, gteClass默认调用Object的方法, o.gteClass也调用Object的方法, 所有两边相等
            Point point = (Point) o;
            //将Object类型o强转为Point类型o
            return x == point.x && y == point.y;
            //对比point p1 和point p2的XY的值
        }
        */

        /*
        Point p = new Point(100,200);
        System.out.println(p);//若是输出引用变量类型时, 默认调用了Object类的toString,  该方法返回的字符串格式为: 类的全称@hashcode值
        System.out.println(p.toString());//若引用的变量Point类中, toString重写了, 则按照重写之后的值输出

        //调用p的tuString()方法将其转换为字符串
        String str = "这是一个点:"+p;
        System.out.println(str);

         */

    }
}
